home *** CD-ROM | disk | FTP | other *** search
/ Multimedia Jumpstart / Multimedia Microsoft Jumpstart Version 1.1a (Microsoft).BIN / develpmt / source / triq / 4d / 4d.h < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-12  |  7.1 KB  |  239 lines

  1. /*
  2.   File: 4D.h
  3.  
  4.   Purpose: definitions for a 4D homogeneous coordinate manipulation package
  5.  */
  6.  
  7. #ifndef MAKELONG
  8.     #define NEAR    near
  9.     #define FAR     far
  10.     #define PASCAL  pascal
  11.  
  12.     typedef unsigned char    BYTE;
  13.     typedef unsigned short    WORD;
  14.     typedef long        LONG;
  15.     typedef unsigned long    DWORD;
  16.     typedef int         BOOL;
  17.     typedef char        *PSTR;
  18.     typedef char NEAR        *NPSTR;
  19.     typedef char FAR        *LPSTR;
  20.     typedef int FAR        *LPINT;
  21.  
  22.     #define MAKELONG(a, b)    ((LONG)(((WORD)(a)) | ((DWORD)((WORD)(b))) << 16))
  23.     #define LOWORD(l)        ((WORD)(l))
  24.     #define HIWORD(l)        ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
  25.     #define LOBYTE(w)        ((BYTE)(w))
  26.     #define HIBYTE(w)        (((WORD)(w) >> 8) & 0xFF)
  27. #endif
  28.  
  29. typedef unsigned long ULONG;    /* ul  */
  30. typedef long          FIXED4D;    /* fx  */
  31. typedef FIXED4D       *PFIXED4D;    /* pfx */
  32.  
  33. #define MAKEFIXED4D(intpart,fractpart) MAKELONG(fractpart,intpart)
  34. #define MAKEFX(i,f)                  MAKEFIXED4D(i,(WORD)(65536L * (DWORD)(f) / 10000L))
  35. #define FX(i)                 MAKEFX(i,0)
  36. #define FXFRAC(fx)             (LOWORD(fx))
  37. #define FXDFRAC(fx)                  (WORD)((DWORD)FXFRAC(fx) * 10000 / 65536L)
  38. #define FXINT(fx)             ((int)HIWORD(fx))
  39.  
  40. typedef struct P4D { FIXED4D x,y,z,w; } POINTFX4D, *PPOINTFX4D, far *LPPOINTFX4D;
  41. typedef struct V4D { FIXED4D x,y,z,w; } VECTORFX;
  42. typedef struct T4D { FIXED4D T[4][4]; } MATRIXFX;
  43.  
  44. extern POINTFX4D    CreatePoint4D(FIXED4D,FIXED4D,FIXED4D,FIXED4D);
  45. extern POINTFX4D  PxT4D(POINTFX4D, MATRIXFX*);
  46. extern void     TransformPoints(MATRIXFX*,POINTFX4D FAR*,POINTFX4D FAR*,int);
  47. extern MATRIXFX Matrix4D();
  48. extern MATRIXFX TxT4D(MATRIXFX*,MATRIXFX*);
  49. extern MATRIXFX Transpose4D(MATRIXFX*);
  50. extern MATRIXFX Identity4D(void);
  51. extern MATRIXFX Translate4D(VECTORFX);
  52. extern MATRIXFX Scale4D(POINTFX4D);
  53. extern MATRIXFX UniformScale4D(FIXED4D);
  54. extern MATRIXFX RotateX(FIXED4D);
  55. extern MATRIXFX RotateY(FIXED4D);
  56. extern MATRIXFX RotateZ(FIXED4D);
  57. extern MATRIXFX Perspective4D(FIXED4D);
  58. extern VECTORFX CreateVector4D(FIXED4D,FIXED4D,FIXED4D);
  59. extern VECTORFX VxT4D(VECTORFX,MATRIXFX*);
  60.  
  61. extern VECTORFX Cross4D(VECTORFX,VECTORFX);
  62. extern FIXED4D    Dot4D(VECTORFX,VECTORFX);
  63. extern VECTORFX Normalize(VECTORFX);
  64. extern POINTFX4D    PVadd(POINTFX4D,VECTORFX);
  65. extern POINTFX4D    Ratio4D(POINTFX4D,POINTFX4D,FIXED4D);
  66. extern VECTORFX Pdiff(POINTFX4D,POINTFX4D);
  67. extern VECTORFX Vscale(FIXED4D,VECTORFX);
  68. extern VECTORFX Vadd(VECTORFX,VECTORFX);
  69. extern VECTORFX Vsub(VECTORFX,VECTORFX);
  70. extern FIXED4D    Vmag(VECTORFX);
  71.  
  72. extern FIXED4D    atofx(char *);
  73.  
  74. /*
  75.  *  Convert a VECTORFX to a point
  76.  */
  77. #define PV(v)  (*(POINTFX4D  *)&(v))
  78. /*
  79.  *  Convert a POINTFX4D to a VECTORFX
  80.  */
  81. #define VP(p)  (*(VECTORFX *)&(p))
  82.  
  83. #define PrintTransform(t) PrintMatrix(&(t).T)
  84.  
  85. /* #define PrintFx(fx)   printf("%5d.%04u",FXINT(fx),FXDFRAC(fx)) */
  86.  
  87. extern void PrintPoint    (POINTFX4D);
  88. extern void PrintVector (VECTORFX);
  89. extern void PrintMatrix (MATRIXFX *);
  90. extern void PrintFx     (FIXED4D fx);
  91.  
  92.  
  93. #define POINTX(p) ((p).x)
  94. #define POINTY(p) ((p).y)
  95. #define POINTZ(p) ((p).z)
  96. #define POINTW(p) ((p).w)
  97.  
  98. #define VECTORX(v) ((v).x)
  99. #define VECTORY(v) ((v).y)
  100. #define VECTORZ(v) ((v).z)
  101.  
  102.  
  103. extern POINTFX4D Origin;
  104. extern FIXED4D   epsilon;
  105.  
  106. #define ONE   FX(1)
  107. #define ZERO  FX(0)
  108. #define FXINF FX(0x7FFF)
  109.  
  110. /* declarations for MATH.ASM */
  111.  
  112. extern void  FAR PASCAL fxCross4D (VECTORFX FAR *, VECTORFX, VECTORFX);
  113.  
  114. extern FIXED4D FAR PASCAL fxsqrt  (FIXED4D);
  115. extern ULONG FAR PASCAL ulsqrt  (ULONG);
  116. extern ULONG FAR PASCAL lDot4D  (VECTORFX, VECTORFX);
  117. extern FIXED4D FAR PASCAL fxLength3D (FIXED4D,FIXED4D,FIXED4D);
  118.  
  119. //extern FIXED4D FAR PASCAL square_root (FIXED4D);
  120. extern FIXED4D FAR PASCAL multiply    (FIXED4D,FIXED4D);
  121. extern FIXED4D FAR PASCAL divide        (FIXED4D,FIXED4D);
  122. extern FIXED4D FAR PASCAL fxRound     (FIXED4D);
  123. extern FIXED4D FAR PASCAL CalcSine    (FIXED4D);
  124. extern FIXED4D FAR PASCAL CalcCosine  (FIXED4D);
  125.  
  126. //#define sin(fx)  CalcSine(fx)
  127. //#define cos(fx)  CalcCosine(fx)
  128. //#define sqrt(fx) square_root(fx)
  129.  
  130. #define fxsin(fx)  CalcSine(fx)
  131. #define fxcos(fx)  CalcCosine(fx)
  132. //#define fxsqrt(fx) square_root(fx)
  133. #define fxmul(x,y) multiply(x,y)
  134. #define fxdiv(x,y) divide(x,y)
  135. #define fxadd(x,y) ((x) + (y))
  136. #define fxsub(x,y) ((x) - (y))
  137.  
  138. #define FXMUL(x,y)    (multiply(x,y))
  139. #define FXDIV(x,y)    (divide(x,y))
  140.  
  141.  
  142. /*
  143. ** Conceptually, a ray is a half-infinite line eminating from
  144. ** a point in a particular direction.  In this module a ray
  145. ** can be thought of as a pair of points P0 and P1.
  146. ** The ray emanates from P0 in the direction of the vector P1-P0.
  147. */
  148.  
  149. typedef struct {
  150.       POINTFX4D P0, P1;
  151. }     RAYFX;
  152.  
  153. extern RAYFX CreateRay    (POINTFX4D,POINTFX4D);
  154. extern RAYFX RxT4D    (RAYFX,MATRIXFX*);
  155. extern void  PrintRay    (RAYFX);
  156.  
  157.  
  158. /*
  159.  * Transform Stuff
  160.  */
  161.  
  162. #define END        0
  163. #define SCALE      1
  164. #define TRANSLATE  2
  165. #define ROTATEX    3
  166. #define ROTATEY    4
  167. #define ROTATEZ    5
  168. #define PROJECT    6
  169. #define VIEWBOX    7
  170.  
  171. #define PROJECT4D    10
  172. #define SCALE4D      11
  173. #define TRANSLATE4D  12
  174.  
  175. struct TRANSFORM_STRUCT {
  176.     MATRIXFX T;
  177.     MATRIXFX Tinv;
  178. };
  179.  
  180. typedef struct TRANSFORM_STRUCT TRANSFORM;
  181.  
  182. extern TRANSFORM *NewTransform          (void);
  183. extern TRANSFORM *MakeTM          ();
  184.  
  185. extern int      FreeTransform       (TRANSFORM *);
  186. extern int      SetTransform          (TRANSFORM *,...);
  187. extern int      AppendTransform     (TRANSFORM *,...);
  188. extern void       PreposeTransform    (TRANSFORM *,TRANSFORM *);
  189. extern void       ComposeTransform    (TRANSFORM *,TRANSFORM *);
  190. extern void      InitTransform       (TRANSFORM *);
  191. extern int      SetCTM          (TRANSFORM *);
  192. extern int      TransformPoint      (POINTFX4D);
  193. extern int      UnTransformPoint    (POINTFX4D);
  194.  
  195. /*-----------------------------------------------------------------------------
  196.   Global variables and macros for transforming points.
  197. -----------------------------------------------------------------------------*/
  198.  
  199. extern    TRANSFORM *CTM;    /* current transform */
  200. #define SetCTM(T)        (CTM = &(T))
  201. #define TransformPoint(P)   (PxT4D ((P),&CTM->T))
  202. #define UnTransformPoint(P) (PxT4D ((P),&CTM->Tinv))
  203. #define TransformRay(R)     (RayxT4D ((R),&CTM->T))
  204. #define UnTransformRay(R)   (RayxT4D ((R),&CTM->Tinv))
  205. /*
  206.  *  Inplace transform of a ray
  207.  */
  208. #define TRay(R)   ((R).P0=  TransformPoint((R).P0),(R).P1=  TransformPoint((R).P1))
  209. #define UnTRay(R) ((R).P0=UnTransformPoint((R).P0),(R).P1=UnTransformPoint((R).P1))
  210.  
  211. /*
  212.  * Example:
  213.  *
  214.  *  TRANSFORM T;
  215.  *  POINT     P = {10.0,10.0,10.0,1.0};
  216.  *
  217.  *  MakeTransform (&T,
  218.  *             ,TRANSLATE,  1.0, 1.0, 1.0
  219.  *             ,SCALE,      1.0, 1.0, 1.0
  220.  *             ,PROJECT,      1.0, 1.0, 1.0
  221.  *             ,          1.0, 1.0, 1.0
  222.  *             ,          1.0, 1.0, 1.0
  223.  *             ,ROTATEX,      90.0
  224.  *             ,ROTATEY,      90.0
  225.  *             ,ROTATEZ,      90.0
  226.  *             ,TRANSLATE4D,1.0, 1.0, 1.0, 1.0
  227.  *             ,SCALE4D,      1.0, 1.0, 1.0, 1.0
  228.  *             ,PROJECT4D,  1.0, 1.0, 1.0, 1.0
  229.  *             ,          1.0, 1.0, 1.0, 1.0
  230.  *             ,          1.0, 1.0, 1.0, 1.0
  231.  *             ,END         <= Dont forget the END!!!
  232.  *           );
  233.  *
  234.  *  SetCTM (T);
  235.  *  P = TransformPoint (P);
  236.  *  P = UnTransformPoint (P);
  237.  *
  238.  */
  239.